<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <!-- <script type="text/javascript">
    
        // enumerate  枚举 遍历 列举
        // 一个对象，通过循环分别访问每个属性叫做遍历
        
        var arr = [1, 2, 3, 4, 5, 6, 7, 8];
        
        for(var i = 0; i < arr.length; i ++){
            console.log(arr[i]);
        }

        // 对象枚举使用 for in 
        var obj = {
            name: 'xiaofang',
            age: 123,
            sex: 'male',
            height: 180,
            weight: 75,
            key: 123
        }

        // prop可以换名字，每圈分别存储不同的属性名，并且是字符串形式的
        for(var prop in obj){
            console.log(prop + " " + typeof(prop));
        }

        var key;
        for(key in obj) {
           // console.log(obj.key); // 系统隐式访问的是obj['key']
            console.log(obj[key]);
        }

    </script> -->

    <!-- <script>
        // hasOwnProperty
        var obj = {
            name: 'xiaofang',
            age: 123,
            sex: 'male',
            height: 180,
            weight: 75,
            __proto__: {  //可以这样修改自己的原型
                lastName: 'deng'
            } 
        }
        Object.prototype.name = 'xiaobai';
        for(var prop in obj) {
            if(obj.hasOwnProperty(prop)){
                // 判断属性是不是自己的
                // 返回布尔值 true 或 false
                // 可以避免遍历原型上的属性
                // for in 可以访问原型链上的属性，但是除了系统自带的属性以及
                // Object.prototype上自己设的属性
                console.log(obj[prop]);
            }
        }

        // in  // 不怎么用
        // 属性名一定是字符串形式的
        // 返回布尔值，判断是否是obj里的属性，只要可以在对象上访问的属性都算
        console.log('lastName' in obj);
        console.log('name' in obj);
        console.log('toString' in obj);


        
    </script> -->

    <script>

        function Person() {

        }

        var person = new Person();


        // A对象 是不是 B构造函数 构造出来的
        // 看 A对象 的原型链上 有没有 B的原型
        // A instanceof B
        console.log(person instanceof Person);
        console.log(person instanceof Object);
        console.log(person instanceof Array);
        console.log(({}) instanceof Person);
        // 对象字面量直接使用或者直接访问其属性，应该加小括号
        // 这是因为大括号的特殊语法，数组就没事


        /*区分数组还是对象的方法*/
        var obj1 = {};
        var arr1 = [];
        //1.
        console.log(obj1.constructor);
        console.log(arr1.constructor);

        //2.
        console.log(obj1 instanceof Array);
        console.log(arr1 instanceof Array);

        //3. 最好的方法
        // Object.prototype.toString = function() {
        //     this
        //     // 里面有this，谁调用的这个方法，this就指向谁
        //     // 若obj.toString(); this指向obj
        //     // 其实函数处理的就是this指向的obj，先识别this，再返回结果
        // }
        console.log(Object.prototype.toString.call(person));
        console.log(Object.prototype.toString.call(obj1));
        console.log(Object.prototype.toString.call(arr1));
        console.log(Object.prototype.toString.call(123));
        console.log(Object.prototype.toString.call(new String('123')));
        console.log(Object.prototype.toString.call(null));

    </script>
</body>
</html>